package com.netty.base;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @author Wang Chen Peng
 * @date 2018/12/24
 * describe: 客户端发送一个请求 服务端返回一个hello netty
 * 简单讲就是个hello word
 */
public class HelloService {

    public static void main(String[] args) throws InterruptedException {

        //主线程组 用于接受客户端的链接 但是不做任何处理
        EventLoopGroup bossGroup = new NioEventLoopGroup();
        //从线程组 boss线程组会把线程丢给此线程组 此线程组真正处理业务
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {

            //启动类
            ServerBootstrap bootstrap = new ServerBootstrap();
            //设置线程组
            bootstrap.group(bossGroup,workerGroup )
                    //当客户端和服务端建立链接以后 链接是什么类型 nio的双向通道
                    .channel(NioServerSocketChannel.class)
                    //子处理器 从线程组做什么的操作 可以理解为一个个的拦截器
                    .childHandler(new HelloServerInit());

            //启动server 设置端口号 启动方式为同步
            ChannelFuture channelFuture = bootstrap.bind(8080).sync();

            //监听关闭的channel 设置为同步的方式
            channelFuture.channel().closeFuture().sync();

        } finally {
            //优雅关闭
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }

    }

}
